#pragma once
// STL
#include <iostream>
// BOOST
#include <boost/mpi.hpp>
#include <boost/program_options.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
// ARMADILLO
#include <armadillo>
using namespace std;
using namespace arma;
namespace mpi = boost::mpi;
namespace po = boost::program_options;

class JOB {
public:
  mpi::communicator& world;
  po::variables_map& vm;
  po::options_description desc;

  JOB(mpi::communicator& world_, po::variables_map& vm_) 
    : world(world_), vm(vm_), desc("Allowed options") {}
  
  void processParameter(int argc, char* argv[]);
  void readInput(mat& Arows, mat& Acols);
  void readInput(mat& A);
  
  void doMultNMF();
  void doParMultNMF();
  void doHALS();
  void doParHALS();
  void doStochHALS();
  void doParStochHALS();
};
